package xdu.lz.stage2_design_pattern.chapter11_up_down_context_pattern;

/**
 * 注意是让每个线程都有唯一与之对应的Context所以Context对当前线程来说是单例，但是Context不是单例！
 * 所以要引入一个中间对象ActionContext是单例的。里面维护着一个线程与Context一一对应的引用。
 */
public class ActionContext {

    //一个线程对应一个上下文对象
    private static final ThreadLocal<Context> threadLocal = new ThreadLocal<Context>(){
        @Override
        protected Context initialValue() {
            return new Context();
        }
    };

    //让ActionContext变成单例
    public static class ActionContextHolder{
        private static final ActionContext context = new ActionContext();
    }

    //single obj
    public static ActionContext getActionContext() {
        return ActionContextHolder.context;
    }

    //返回线程对应的上下文对象。
    public Context getContext(){
        return threadLocal.get();
    }
}
